package com.huey.utils.design.structure.proxy.demo3;

import com.huey.utils.design.structure.proxy.demo2.Cicada;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * cglib动态代理
 * @author xubo
 * @date 2022/3/30 14:02
 */
public class PrayingMantis implements MethodInterceptor {
    /**
     * 代理对象
     */
    private Cicada cicada;

    public Cicada getInstance(Cicada cicada) {
        this.cicada = cicada;
        //Enhancer 它是一个字节码增强器，可以用来为无接口的类创建代理。它的功能与java自带的Proxy类挺相似的。
        // 它会根据某个给定的类创建子类，并且所有非final的方法都带有回调钩子
        Enhancer enhancer = new Enhancer();
        //类加载
        enhancer.setSuperclass(this.cicada.getClass());
        enhancer.setCallback(this);
        return (Cicada) enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Object object = methodProxy.invokeSuper(o, objects);
        secondaryMain();
        return object;
    }

    private void secondaryMain() {
        System.out.println("螳螂捕蝉 - 次要业务");
    }

    public static void main(String[] args) {
        PrayingMantis prayingMantis = new PrayingMantis();
        Cicada instance = prayingMantis.getInstance(new Cicada());
        instance.mainService();
        // 结果：主要业务
        //      螳螂捕蝉 - 次要业务
    }


}
